// 给出一个升序排序的链表，删除链表中的所有重复出现的元素，只保留原链表中只出现一次的元素。
// 例如：

// 1->2->3->3->4->4->5 处理后为 1->2->5
// 解题思路：

// 借助一个辅助头节点，设置两个指针 pre 和 cur 分别指向上一个结点和当前结点，
// 当 cur 的值和 cur.next 的值相等就让 cur 往前走，直到不相等的时候退出循环，
// 这时候 cur 还是重复值，令 cur 再往前走一位，调整 pre 和 cur 再次进行判断。

// 举例：1->2->3->3->3->4->5 两个指针的走向如下

// - -1(辅助头结点)->1->2->3->3->3->4->5
// - -1(pre)->1(cur)->2->3->3->3->4->5
// - -1->1(pre)->2(cur)->3->3->3->4->5
// - -1->1->2(pre)->3(cur)->3->3->4->5
// - -1->1->2(pre)->3->3(cur)->3->4->5
// - -1->1->2(pre)->3->3->3(cur)->4->5
// - -1->1->2(pre)->3->3->3->4(cur)->5
// - -1->1->2(pre)->4(cur)->5
// - -1->1->2->4(pre)->5(cur)
// --------------- 测试demo ---------------
function ListNode(x) {
  this.val = x;
  this.next = null;
}
let demo = new ListNode(1);
demo.next = new ListNode(2);
demo.next.next = new ListNode(3);
demo.next.next.next = new ListNode(3);
demo.next.next.next.next = new ListNode(4);
demo.next.next.next.next.next = new ListNode(4);
demo.next.next.next.next.next.next = new ListNode(5);
// --------------- 测试demo ---------------

function deleteDuplication(pHead) {
  // write code here
  if (!pHead) {
    return null;
  }
  //辅助头节点
  let head = new ListNode(-1);
  // 辅助节点的下一个指向我们参数的这个头节点
  head.next = pHead;
  let pre = head;
  let cur = head.next;
  while (cur !== null) {
    // 下个节点不为空并且两个连续的节点值相同
    if (cur.next !== null && cur.next.val === cur.val) {
      // 让cur指向连续相同的几个节点中最后一个
      while (cur.next !== null && cur.next.val === cur.val) {
        cur = cur.next;
      }
      // cur指向下个不相同的
      cur = cur.next;
      // pre直接连接到cur不相同的节点 把中间相同的节点都跳过
      pre.next = cur;
    } else {
      // 连续节点不相同的时候 用pre保存当前节点信息 再用cur连接不相同的节点
      pre = cur;
      cur = cur.next;
    }
  }
  return head.next;
}

console.log(deleteDuplication(demo));
